# -*- coding: utf-8 -*-
import scrapy


class WorkSpider(scrapy.Spider):
    custom_settings = {
        'LOG_LEVEL': 'DEBUG',       # Log等级，默认是最低级别debug
        'ROBOTSTXT_OBEY': False,    # default Obey robots.txt rules
        'DOWNLOAD_DELAY': 2,        # 下载延时，默认是0
        'COOKIES_ENABLED': True,    # 默认enable，爬取登录后的数据时需要启用。 会增加流量，因为request和response中会多携带cookie的部分
        'COOKIES_DEBUG': True,      # 默认值为False,如果启用，Scrapy将记录所有在request(Cookie 请求头)发送的cookies及response接收到的cookies(Set-Cookie 接收头)。
        'DOWNLOAD_TIMEOUT': 25,     # 下载超时，既可以是爬虫全局统一控制，也可以在具体请求中填入到Request.meta中，Request.meta['download_timeout']
    }
    name = 'work'
    allowed_domains = ['www.mafengwo.com']
    # start_urls = ['http://www.mafengwo.com/']

    username = '13632635022'
    password = 'cgf081214'
    headerdata = {
        "Referer": "https://passport.mafengwo.cn/",
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    }

    def start_requests(self):
        print("===================start mafengwo clawer==========================")
        loginPostUrl = "https://passport.mafengwo.cn/login/"
        formdata = {
            "passport": self.username,
            "password": self.password,
            'code': ''
            # "other": "other",
        }
        # FormRequest 是Scrapy发送POST请求的方法

        yield scrapy.FormRequest(
            url=loginPostUrl,
            headers=self.headerdata,
            # method="POST",
            formdata=formdata,
            callback=self.loginResParse,
            dont_filter=True,  # 防止页面因为重复爬取，被过滤了
        )

    def loginResParse(self, response):
        print('=====================charge whether dologin successfully========================')
        print(f"loginResParse: url = {response.url}")

        # 通过访问个人中心页面的返回状态码来判断是否为登录状态
        # 这个页面，只有登录过的用户，才能访问。否则会被重定向(302) 到登录页面
        routeUrl = "http://www.mafengwo.cn/plan/route.php"
        # 下面有两个关键点
        # 第一个是header，如果不设置，会返回500的错误
        # 第二个是dont_redirect，设置为True时，是不允许重定向，用户处于非登录状态时，是无法进入这个页面的，服务器返回302错误。
        #       dont_redirect，如果设置为False，允许重定向，进入这个页面时，会自动跳转到登录页面。会把登录页面抓下来。返回200的状态码
        yield scrapy.Request(
            url=routeUrl,
            headers=self.headerdata,
            meta={
                'dont_redirect': True,      # 禁止网页重定向302, 如果设置这个，但是页面又一定要跳转，那么爬虫会异常
                # 'handle_httpstatus_list': [301, 302]      # 对哪些异常返回进行处理
            },
            callback=self.isLoginStatusParse,
            dont_filter=True,
        )

    def isLoginStatusParse(self, response):
        print('===========================Congratulation=====================================')
        print(f"isLoginStatusParse: url = {response.url}")

        # 如果能进到这一步，都没有出错的话，那么后面就可以用登录状态，访问后面的页面了
        # 不需要存储cookie
        # 其他网页爬取

        yield scrapy.Request(
            url="https://www.mafengwo.cn/travel-scenic-spot/mafengwo/10045.html",
            headers=self.headerdata,
            dont_filter=True
            # 如果不指定callback，那么默认会使用parse函数
        )

    def parse(self, response):
        print('===========================大获成功!!!!===================================')
        title = response.selector.xpath('//title/text()').extract_first()
        print(title)
